import json
import re

from django.contrib.auth import login
from django.shortcuts import render

# Create your views here.
# 获取 QQ 扫码登录链接
from django.views import View
from django .http import HttpResponse,JsonResponse


from django.conf import settings ###
from QQLoginTool.QQtool import OAuthQQ #下载的三方包
from django_redis import get_redis_connection

from apps.oauth.models import OAuthQQUser
from apps.user.models import User
from zmeiduo.utils.secret import SecretOauth


class QQURLView(View):
    def get(self,request):
        #next 表示从那个页面进入到的登录页面
        # 将来登录成功后 就自动回到那个页面
        next=request.GET.get('next') #获取那个页面进入的 登录成功自动回到那个页面

        #获取qq登录页面网址
        #创建OAutchqq类的对象
        oauth=OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                      client_secret=settings.QQ_CLIENT_SECRET,
                      redirect_uri=settings.QQ_REDIRECT_URI,
                      state=next)
        #调用对象的湖区qq地址方法
        login_url=oauth.get_qq_url()

        #返回登录地址
        from django import http
        return JsonResponse({'code':0,'errmsge':'ok','login_url':login_url})


class  QQUserView(View):
    '''
    Oauth2.0认证
    获取前段发送过来的code参数
    '''
    #回调过来的
    def get(self,request):
        code=request.GET.get("code")
        if not code:
            # 判断 code 参数是否存在  有没有值
            return JsonResponse({'code': 400,
                                      'errmsg': '缺少code参数'})
        #调用安装的QQloginTool
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI)
        try:
        #携带code想qq服务器请求 access_token
        #code换token
            access_token=oauth.get_access_token(code)
        #携带token想qq服务器请求openid
            openid=oauth.get_open_id(access_token)
        except Exception as e:
            #如果上面的出错了 验证码失败
            print(e)
            return JsonResponse({'code': 400,
                          'errmsg': '2.0认证失败'})
        try:
            oauth_qq=OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:######
            #使用加密类型加密openid
            access_token = SecretOauth().dumps({'openid': openid})
            # access_toke= SecretOauth().dumps({'openid':openid})
            print(access_token)
            #返回三百 重定向绑定页面
            return JsonResponse({'code': 300, 'errmsg': 'ok', 'access_token': access_token})

            pass


        else:
            #如果opendi已绑定
            user=oauth_qq.user
            #实现状态保存
            login(request,user)
            #创建重定向到主页的对象
            response=JsonResponse({'code':0,"errmsge":"ok"})

            response.set_cookie('username',user.username,max_age=36363636)
            return response

    def post(self,reqeust):
        #绑定用户
        dict_join=json.loads(reqeust.body.decode())
        mobile=dict_join.get('mobile')
        password=dict_join.get('password')
        sms_code=dict_join.get('sms_code')
        access_token=dict_join.get('access_token')

        # 校验参数
        if not all([mobile,password,sms_code]):
            return JsonResponse({"code":400,'参数':"为空"})
        #手机号判正则
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return JsonResponse({"code": 400, 'shoji': "为空"})
        #验证码 链接redis
        redis_conn=get_redis_connection('verify_code')
        #取出来转换字符串
        # sms_code_sever=redis_conn.get('mobile')
        # if sms_code_sever is None:
        #     return JsonResponse({"code": 400, 'mobile': "为空"})
        # #进行判断
        # if sms_code!=sms_code_sever.decode():
        #     return JsonResponse({"code": 400, '不相等': "为空"})
        # 判断有没有这个用户解密判断
        #使用之前先解密
        openid = SecretOauth().loads(access_token).get('openid')
        # openid=SecretOauth().loads(access_token).get('openid')
        if not openid:
            return JsonResponse({"code": 400, 'openid': "为空"})
        try:
            # 判断有没有这个用户
            user=User.objects.get(mobile=mobile)
            if user is None:
                user=User.objects.create_user(username=mobile,
                                              password=password,
                                              mobile=mobile)
            else:
                if not user.check_password(password):
                    return JsonResponse({'code': 400,
                                              'errmsg': '输入的密码不正确'})
        except Exception as e:
            print(e)
            return JsonResponse({"code": 400, 'openid': "为空"})


        # 将用户绑定openid上
        try:
            OAuthQQUser.objects.create(openid=openid,
                                       user=user)
        except Exception:
            return JsonResponse({'code': 400,
                                      'errmsg': '往数据库添加数据出错'})
        # 没有保存数据库 保存登录状态 返回
        #实现登录状态
        login(reqeust,user)
        # 返回
        return  JsonResponse({'code':133,"成功":"成功"})